package com.ybxy.web;

import java.sql.*;

/**
 * jdbc 的入门案例
 * 在本案例学习jdbc所有知识
 * 1. 加载驱动
 * 2. 获取连接（三次握手）
 * 3. 获取jdbc
 * 4. 执行sql
 * 5. 处理结果
 * 6。 释放资源（四次握手）
 */
public class JDBC {
    //加载驱动，一次，构造代码块，静态构造代码块，构造方法
    static{
        //使用反射机制加载驱动
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
            System.out.println("找不到驱动，加载驱动失败！");
        }
    }

    /**
     * 获取连接对象
     * @return
     * @throws SQLException
     */
    public static Connection getConn() throws SQLException {
        //使用jdbc的api，获取对象
        long time = System.currentTimeMillis(); //=new Date()，但Data实际上就是调用这个方法，如果计算毫秒级，这个方法的效率更高
        //配置数据库连接信息
        String url = "jdbc:mysql://localhost:3306/newsdb";
        String username = "root";
        String password = "root";
        //使用jdbc的api，获取连接对象
        Connection root = DriverManager.getConnection(url, username, password);
        System.out.println("获取连接对象耗时：" + (System.currentTimeMillis()-time) + "毫秒");
        return root;
    }

    /**
     * 获取jdbc执行器，执行sql的api
     * @param connection
     * @return  返回statment执行器，不会对sql进行预编译
     * @throws SQLException
     */
    public static Statement getStatement(Connection connection) throws SQLException {
        return connection.createStatement();
    }

    /**
     * 执行sql语句 增删改操作，返回成功修改数据库行数 int
     * @param sql   带参数
     * @param statement
     * @return
     */
    public static int exeUpdata(String sql,Statement statement) throws SQLException {
        return statement.executeUpdate(sql);
    }

    /**
     * 执行sql，查询，返回游标
     * @param sql
     * @param statement
     * @return
     * @throws SQLException
     */
    public static ResultSet getResult(String sql,Statement statement) throws SQLException {
        return statement.executeQuery(sql);
    }

    //解析数据、处理结果，一般放在dao层中实现，注意关闭顺序
    //关闭连接，释放资源
    public static void close(ResultSet resultSet,Statement statement,PreparedStatement preparedStatement,Connection connection) {
        if(resultSet != null){
            try{
                resultSet.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            resultSet = null;
        }
        if(statement != null){
            try{
                statement.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            statement = null;
        }
        if(preparedStatement != null){
            try{
                preparedStatement.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            preparedStatement = null;
        }
        if(connection != null){
            try{
                connection.close();
            }catch (Exception e){
                e.printStackTrace();
            }
            connection = null;
        }
    }
//    public static void close(Statement stmt, Connection conn){
//        if (stmt!=null){
//            try {
//                stmt.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//
//        if (conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    public static void close(ResultSet rs,Statement stmt, Connection conn){
//        if (rs!=null){
//            try {
//                rs.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//
//        if (stmt!=null){
//            try {
//                stmt.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//
//        if (conn!=null){
//            try {
//                conn.close();
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }

}
